home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 10
/
FM Towns Free Software Collection 10.iso
/
ms_dos
/
data
/
awkscrpt
/
simz80.awk
< prev
next >
Wrap
Text File
|
1995-02-11
|
13KB
|
749 lines
BEGIN {
err="/dev/stderr"
if(ARGC>1) {dbg=ARGV[1];ARGV[1]="-";ARGC=2}
printf("\nZ80シミュレーションデバッガ") >err
printf(" SIMZ80\t\t\tBy Jouji\n\n") >err
em[2]="未登録アドレスを実行しました"
em[3]="ソースファイルの範囲を越えました"
em[4]="0番地を実行しました"
hm[1]=" G:go";hm[2]="R:dump register";hm[3]="ER:enter register"
hm[4]="P:print number";hm[5]=" T:trace";hm[6]="M:dump memory"
hm[7]="EM:enter memory";hm[8]="F:read *.dbg file"
hm[9]=" H:help";hm[10]="L:list";hm[11]="!:system";hm[12]="Q:quit"
h["0"]=0; h["1"]=1; h["2"]=2; h["3"]=3; h["4"]=4; h["5"]=5; h["6"]=6
h["7"]=7; h["8"]=8; h["9"]=9; h["A"]=10;h["B"]=11;h["C"]=12;h["D"]=13
h["E"]=14;h["F"]=15
FS=",|[ \t]+"
rb="^[ABCDEHLIR]$"
rw="^(AF|BC|DE|HL|IX|IY|SP)$"
rd="^(AF|BC|DE|HL)$"
rx="^(IX|IY|SP)$"
bn[0]=1;bn[1]=2;bn[2]=4;bn[3]=8;bn[4]=16;bn[5]=32;bn[6]=64;bn[7]=128
phl="(HL)";pde="(DE)";psp="(SP)"
if(dbg) read(dbg)
printf("Command>") >err
}
{$0=toupper($0)}
$1=="T" {
if(!$2) $2=substr(ad,2)
ad=adrs("I",$2)
for(;;) {
chkad()
printf("\n%-5s%-18sTrace>",substr(ad,2),d[ad])
getline
if($0) break
exec()
dspr()
}
}
$1=="G" {
if(!$2) $2=substr(ad,2)
ad=adrs("I",$2)
if(!$3) $3="0"
ae=adrs("I",$3)
printf("\n\n\n")
while(ad!=ae) {
chkad()
printf("\x1b[3A%-5s%-18s\n",substr(ad,2),d[ad])
exec()
dspr()
}
}
$1=="!" {
sub(/^! +/,"")
system($0)
}
$1=="ER" {
for(i=2;i<NF;i+=2) {
n=hton($(i+1))
if($i~rb) d[$i]=n%256
else if($i~rw) storew($i,n)
}
}
$1=="EM" {
a=adrs("D",$2)
for(i=3;i<=NF;i++) {
d[a]=hton($i)%256
a=incadr(a)
}
}
$1=="R" {
dspr()
}
$1=="F" {
if(!index($2,".")) $2=$2".DBG"
read($2)
}
$1=="M" {
if($2=="") $2="0"
if($3=="") $3="FFFF"
sa=adrs("D",$2)
ea=adrs("D",$3)
i=0
for(a in d)
if(a~/^D....$/) {
w[++i]=a
for(j=i;j>1&&w[j-1]>w[j];j--) {
t=w[j-1];w[j-1]=w[j];w[j]=t
}
}
for(j=1;j<=i;j++) {
a=w[j]
if(a~/^D....$/ && a>=sa && a<=ea)
printf("%s %02X\n",substr(a,2),d[a])
}
}
$1=="L" {
if($2=="") $2="0"
if($3=="") $3="FFFF"
sa=adrs("I",$2)
ea=adrs("I",$3)
for(i=1;i<=maxl;i++) {
a=addr[i]
if(a~/^I....$/ && a>=sa && a<=ea)
printf("%s %s\n",substr(a,2),d[a])
}
}
$1=="P" {
if($2~/H$/) n=hton($2)
else n=$2+0
printf("Hex=%04X Dec=%d\n",n,n)
}
$1=="H" {
for(i=1;i<13;i++) printf("%-20s",hm[i]) >err
}
$1=="Q" {exit}
{printf("Command>") >err}
function read(dbg, i,f) {
for(a in d) delete d[a]
for(a in addr) delete addr[a]
for(a in line) delete line[a]
d["A"]=0;d["B"]=0;d["C"]=0;d["D"]=0;d["E"]=0;d["H"]=0;d["L"]=0
d["F"]=0;d["I"]=0;d["R"]=0;d["IX"]=0;d["IY"]=0;d["SP"]=53248
while(getline<dbg >0) {
sub(/ *;.*$/,"")
if($2~/^I/) {
d[$2]=substr($0,12)
if(!f) {f=1;ad=$2}
}else d[$2]=hton($3)
addr[++i]=$2
line[$2]=i
}
maxl=i
}
function adrs(c,s) {
s=sprintf("%s%4s",c,s)
gsub(/ /,"0",s)
return s
}
function chkad() {
if(ad=="I0000") error(4)
if(!(ad in d)) error(2)
}
function exec(i) {
fj=0
no=split(d[ad],x)
c=x[1];o1=x[2];o2=x[3]
if(c=="CCF") fc=1-fc
else if(c=="SCF") fc=1
else if(c=="CPL") d["A"]=255-d["A"]
else if(c=="NEG") neg()
else if(c=="JP") jp(o1,o2)
else if(c=="JR") jr(o1,o2)
else if(c=="CALL") call(o1,o2)
else if(c=="RET") ret(o1)
else if(c=="DJNZ") {if(--d["B"]) jrs(o1)}
else if(c=="AND") and(o1)
else if(c=="XOR") xor(o1)
else if(c=="OR") or(o1)
else if(c=="CP") cp(o1)
else if(c=="INC") inc(o1)
else if(c=="DEC") dec(o1)
else if(c=="LD") ld(o1,o2)
else if(c=="EX") ex(o1,o2)
else if(c=="PUSH") push(o1)
else if(c=="POP") pop(o1)
else if(c=="LDI") ldi()
else if(c=="LDIR") ldir()
else if(c=="LDD") ldd()
else if(c=="LDDR") lddr()
else if(c=="CPI") cpi()
else if(c=="CPIR") cpir()
else if(c=="CPD") cpd()
else if(c=="CPDR") cpdr()
else if(c=="ADD") add(o1,o2)
else if(c=="ADC") adc(o1,o2)
else if(c=="SUB") sba(o1)
else if(c=="SBC") sbc(o1,o2)
else if(c=="RLCA") rlca()
else if(c=="RLA") rla()
else if(c=="RRCA") rrca()
else if(c=="RRA") rra()
else if(c=="RLD") rld()
else if(c=="RRD") rrd()
else if(c=="RLC") rlc(o1)
else if(c=="RL") rl(o1)
else if(c=="RRC") rrc(o1)
else if(c=="RR") rr(o1)
else if(c=="SLA") sla(o1)
else if(c=="SRA") sra(o1)
else if(c=="SRL") srl(o1)
else if(c=="BIT") bit(o1,o2)
else if(c=="SET") set(o1,o2)
else if(c=="RES") res(o1,o2)
if(fj) return
l=line[ad]+1
if(!(l in addr)) error(3)
ad=addr[l]
}
function jp(o1,o2) {
if(no==3) {
if((o1=="NZ"&&fz)||(o1=="Z"&&!fz)||(o1=="NC"&&fc)||
(o1=="C"&&!fc)||(o1=="P"&&fs)||(o1=="M"&&!fs)||
(o1=="PO"&&fp)||(o1=="PE"&&!fp)) return
o1=o2
}
if(o1~/^\(/) o1=hexadr(o1)
ad="I" o1
fj=1
}
function jr(o1,o2) {
if(no==2) jrs(o1)
else if((o1=="NZ"&&!fz)||(o1=="Z"&&fz)||
(o1=="NC"&&!fc)||(o1=="C"&&fc)) jrs(o2)
}
function jrs(opr, e,a) {
fj=1
if(opr~/^@/)
ad="I" substr(opr,2)
else {
e=hton(opr); e=(e>127)?e-256:e
a=hton(substr(ad,2))+e+2
ad=sprintf("I%04X",a)
}
}
function call(o1,o2, i) {
if(no==3) {
if((o1=="NZ"&&fz)||(o1=="Z"&&!fz)||(o1=="NC"&&fc)||
(o1=="C"&&!fc)||(o1=="P"&&fs)||(o1=="M"&&!fs)||
(o1=="PO"&&fp)||(o1=="PE"&&!fp)) return
o1=o2
}
i=hton(substr(ad,2))+3
d["SP"]-=2
storew(psp,i)
ad="I" o1
fj=1
}
function ret(opr, i) {
if((no==2)&&((opr=="NZ"&&fz)||(opr=="Z"&&!fz)||(opr=="NC"&&fc)||
(opr=="C"&&!fc)||(opr=="P"&&fs)||(opr=="M"&&!fs)||
(opr=="PO"&&fp)||(opr=="PE"&&!fp))) return
i=evalw(psp)
d["SP"]+=2
ad=sprintf("I%04X",i)
fj=1
}
function ld(o1,o2, v) {
if(o1~rw||o2~rw) {
v=evalw(o2)
storew(o1,v)
}else {
v=evalb(o2)
storeb(o1,v)
}
}
function ex(o1,o2, i,j) {
i=evalw(o2)
j=evalw(o1)
storew(o1,i)
storew(o2,j)
}
function push(opr, i) {
i=evalw(opr)
d["SP"]-=2
storew(psp,i)
}
function pop(opr, i) {
i=evalw(psp)
d["SP"]+=2
storew(opr,i)
}
function ldi(n) {
n=evalb(phl)
storeb(pde,n)
inc("HL")
inc("DE")
dec("BC")
fp=(evalw("BC"))?1:0
}
function ldir(i,j,n) {
j=evalw("BC")
if(j==0) j=65536
for(i=j;i>0;i--) {
n=evalb(phl)
storeb(pde,n)
inc("HL")
inc("DE")
}
d["B"]=0
d["C"]=0
}
function ldd(i,n) {
n=evalb(phl)
storeb(pde,n)
dec("HL")
dec("DE")
dec("BC")
fp=(evalw("BC"))?1:0
}
function lddr(i,j,n) {
j=evalw("BC")
if(j==0) j=65536
for(i=j;i>0;i--) {
n=evalb(phl)
storeb(pde,n)
dec("HL")
dec("DE")
}
d["B"]=0
d["C"]=0
}
function cpi(i) {
i=d["A"]-evalb(phl)
fz=!i
fs=(i>127)
inc("HL")
dec("BC")
fp=(evalw("BC"))?1:0
}
function cpir(i) {
do {
i=d["A"]-evalb(phl)
fz=!i
fs=(i>127)
inc("HL")
dec("BC")
fp=(evalw("BC"))?1:0
} while(!fz&&fp)
}
function cpd(i) {
i=d["A"]-evalb(phl)
fz=!i
fs=(i>127)
dec("HL")
dec("BC")
fp=(evalw("BC"))?1:0
}
function cpdr(i) {
do {
i=d["A"]-evalb(phl)
fz=!i
fs=(i>127)
dec("HL")
dec("BC")
fp=(evalw("BC"))?1:0
} while(!fz&&fp)
}
function add(o1,o2, i,v) {
if(o1=="A") {
i=d["A"]+evalb(o2)
if(i>255) {fc=1;i-=256} else fc=0
d["A"]=i
fz=!i
fs=(i>127)
}else {
i=evalw(o1)+evalw(o2)
if(i>65535) {fc=1;i-=65536} else fc=0
storew(o1,i)
}
}
function adc(o1,o2, i,v) {
if(o1=="A") {
i=d["A"]+evalb(o2)+fc
if(i>255) {fc=1;i-=256} else fc=0
d["A"]=i
fs=(i>127)
}else {
i=256*d["H"]+d["L"]+evalw(o2)+fc
if(i>65535) {fc=1;i-=65536} else fc=0
d["H"]=int(i/256)
d["L"]=i%256
fs=(i>32767)
}
fz=!i
}
function cp(opr, i) {
i=d["A"]-evalb(opr)
if(i<0) {fc=1;i+=256} else fc=0
fz=!i
fs=(i>127)
}
function sba(opr, i) {
i=d["A"]-evalb(opr)
if(i<0) {fc=1;i+=256} else fc=0
d["A"]=i
fz=!i
fs=(i>127)
}
function sbc(o1,o2, i,v) {
if(o1=="A") {
i=d["A"]-evalb(o2)-fc
if(i<0) {fc=1;i+=256} else fc=0
d["A"]=i
fs=(i>127)
}else {
i=256*d["H"]+d["L"]-evalw(o2)-fc
if(i<0) {fc=1;i+=65536} else fc=0
d["H"]=int(i/256)
d["L"]=i%256
fs=(i>32767)
}
fz=!i
}
function neg(i) {
i=256-d["A"]
if(i==256) {i-=256;fc=1} else fc=0
fz=!i
fs=(i>127)
d["A"]=i
}
function and(opr, i,m,n) {
n=evalb(opr)
m=d["A"]
d["A"]=i=andv(m,n)
fc=0
fz=!i
fs=(i>127)
}
function xor(opr, i) {
n=evalb(opr)
m=d["A"]
d["A"]=i=m+n-2*andv(m,n)
fc=0
fz=!i
fs=(i>127)
}
function or(opr, i) {
n=evalb(opr)
m=d["A"]
d["A"]=i=m+n-andv(m,n)
fc=0
fz=!i
fs=(i>127)
}
function andv(m,n, i,j,f) {
for(i=7;i>=0;i--) {
f=0
if(m>=bn[i]) {m-=bn[i];f=1}
if(n>=bn[i]) {n-=bn[i];if(f)j+=bn[i]}
}
return j
}
function inc(opr, i) {
if(opr~rw) {
i=evalw(opr)+1
if(i>65535) i-=65536
storew(opr,i)
}else {
i=evalb(opr)+1
if(i>255) i-=256
storeb(opr,i)
fz=!i
fs=(i>127)
}
}
function dec(opr, i) {
if(opr~rw) {
i=evalw(opr)-1
if(i<0) i+=65536
storew(opr,i)
}else {
i=evalb(opr)-1
if(i<0) i+=256
storeb(opr,i)
fz=!i
fs=(i>127)
}
}
function rlca(i) {
i=2*d["A"]
if(i>255) {i-=255;fc=1}
else fc=0
d["A"]=i
}
function rla(i) {
i=2*d["A"]+fc
if(i>255) {i-=256;fc=1}
else fc=0
d["A"]=i
}
function rrca(i,j) {
i=d["A"]
j=i%2
i=int(i/2)+128*j
fc=j
d["A"]=i
}
function rra(i,j) {
i=d["A"]
j=i%2
i=int(i/2)+128*fc
fc=j
d["A"]=i
}
function rld(i,j,k,n,m) {
i=int(d["A"]/16)
j=d["A"]%16
k=evalb(phl)
m=int(k/16)
n=k%16
d["A"]=16*i+m
k=16*n+j
storeb(phl,k)
fz=!k
fs=(k>127)
}
function rrd(i,j,k,n,m) {
i=int(d["A"]/16)
j=d["A"]%16
k=evalb(phl)
m=int(k/16)
n=k%16
d["A"]=16*i+n
k=16*j+m
storeb(phl,k)
fz=!k
fs=(k>127)
}
function rlc(opr, i) {
i=2*evalb(opr)
if(i>255) {i-=255;fc=1}
else fc=0
storeb(opr,i)
fz=!i
fs=(i>127)
}
function rl(opr, i) {
i=2*evalb(opr)+fc
if(i>255) {i-=256;fc=1}
else fc=0
storeb(opr,i)
fz=!i
fs=(i>127)
}
function rrc(opr, i,j) {
i=evalb(opr)
j=i%2
i=int(i/2)+128*j
fc=j
storeb(opr,i)
fz=!i
fs=(i>127)
}
function rr(opr, i,j) {
i=evalb(opr)
j=i%2
i=int(i/2)+128*fc
fc=j
storeb(opr,i)
fz=!i
fs=(i>127)
}
function sla(opr, i) {
i=2*evalb(opr)
if(i>255) {i-=256;fc=1}
storeb(opr,i)
fz=!i
fs=(i>127)
}
function sra(opr, i,j) {
i=evalb(opr)
if(i>127) j=128
fc=i%2
i=int(i/256)+j
storeb(opr,i)
fz=!i
fs=(i>127)
}
function srl(opr, i) {
i=evalb(opr)
fc=i%2
i=int(i/256)
storeb(opr,i)
fz=!i
fs=(i>127)
}
function bit(o1,o2) {
byte2bit(o2)
fz=bt[o1]
}
function set(o1,o2) {
byte2bit(o2)
bt[o1]=1
storeb(o2,bit2byte())
}
function res(o1,o2) {
byte2bit(o2)
bt[o1]=0
storeb(o2,bit2byte())
}
function bit2byte(n,i) {
for(i=0;i<8;i++) {if(bt[i]) n+=bn[i]}
return n
}
function byte2bit(opr, n,i) {
n=evalb(opr)
for(i=7;i>=0;i--)
if(n>=bn[i]) {bt[i]=1;n-=bn[i]} else bt[i]=0
}
function evalb(opr, a) {
if(opr~rb) return d[opr]
if(opr~/^\(/) {
a="D" hexadr(opr)
return d[a]
}
return hton(opr)
}
function evalw(opr, a,b) {
if(opr~rd) {
a=substr(opr,2)
b=substr(opr,1,1)
return 256*d[b]+d[a]
}
if(opr~rx) return d[opr]
if(opr~/^\(/) {
a="D" hexadr(opr)
b=incadr(a)
return 256*d[b]+d[a]
}
return hton(opr)
}
function storeb(opr,i, a) {
if(opr~rb) a=opr
else a="D" hexadr(opr)
d[a]=i
}
function storew(opr,v, h,l,a,b) {
if(opr~rx) d[opr]=v
else if(opr~rd) {
h=substr(opr,1,1)
l=substr(opr,2)
d[h]=int(v/256)
d[l]=v%256
}else {
a="D" hexadr(opr)
b=incadr(a)
d[a]=v%256
d[b]=int(v/256)
}
}
function hexadr(opr, h,l,i,j) {
opr=substr(opr,2)
sub(/.$/,"",opr)
if(opr~rd) {
h=substr(opr,1,1)
l=substr(opr,2)
return sprintf("%02X%02X",d[h],d[l])
}
if(opr~/^SP/) return sprintf("%04X",d["SP"])
if(opr~/^I[XY]/) {
h=substr(opr,1,2)
l=substr(opr,3)
j=hton(l)
if(j>127) j=j-256
i=d[h]+j
if(i<0) i+=65536
if(i>65535) i-=65536
return sprintf("%04X",i)
}
return opr
}
function incadr(a, c,i) {
c=substr(a,1,1)
i=hton(substr(a,2))+1
if(i>65535) i-=65535
return sprintf("%s%04X",c,i)
}
function dspr() {
printf("A=%02X BC=%02X%02X DE=%02X%02X HL=%02X%02X\n",
d["A"],d["B"],d["C"],d["D"],d["E"],d["H"],d["L"])
printf("F=?? IX=%04X IY=%04X SP=%04X CF=%d ZF=%d SF=%d\n",
d["IX"],d["IY"],d["SP"],fc,fz,fs)
}
function hton(s, i,m,n,c) {
m=length(s)
for(i=1;i<=m;i++) {
c=substr(s,i,1)
if(c!~/[0-9A-F]/) break
n=16*n+h[c]
}
return n
}
function error(n) {
print em[n] >err
printf("Command>") >err
next
}